package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanEmpresaAssinante;
import br.edu.universo.si.projeto2.infojob.client.bean.BeanEstado;
import br.edu.universo.si.projeto2.infojob.client.componentes.CEPBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.CNPJBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.CPFBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.EMailBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.NumberBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.comboboxes.EstadosListBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.TextBox;
import com.google.gwt.user.client.ui.Widget;
import com.google.gwt.user.client.ui.FlexTable.FlexCellFormatter;

public class AAlteraDadosEmpresa extends DockPanel
{
	private FlexTable flexTable;

	private CNPJBox cnpjTxt;
	private TextBox razaoSocialTxt;
	private TextBox responsavelTxt;
	private NumberBox telefoneTxt;
	private EMailBox emailTxt;
	private CPFBox cpfResponsavelTxt;
	private NumberBox rgResponsavelTxt;
	private CEPBox cepTxt;
	private TextBox enderecoTxt;
	private NumberBox numeroTxt;
	private TextBox bairroTxt;
	private TextBox complementoTxt;
	private TextBox cidadeTxt;
	private EstadosListBox estadosListBox;

	private Button atualizarBtn = new Button("Atualizar");
	
	private BeanEmpresaAssinante bEmpresaAssinante;

	public AAlteraDadosEmpresa(BeanEmpresaAssinante bEmpresaAssinante)
	{
		this.bEmpresaAssinante = bEmpresaAssinante;

		AsyncCallback<BeanEmpresaAssinante> callbackDadosEmpresa = new AsyncCallback<BeanEmpresaAssinante>()
		{
			public void onSuccess(BeanEmpresaAssinante resultDadosEmpresa)
			{
				flexTable = new FlexTable();
				flexTable.setCellSpacing(5);

				inicializarComponentes();
				setarTamanhoCampos();
				setarAlinhamento();
				estadosListBox.setIndice(0);
				flexTable.setWidget(0, 0, new HTML("<b>ATUALIZE OS DADOS DE SUA EMPRESA</b>"));
				flexTable.getFlexCellFormatter().setColSpan(0, 0, 2);
				flexTable.getFlexCellFormatter().setAlignment(0, 0, HasHorizontalAlignment.ALIGN_LEFT, HasVerticalAlignment.ALIGN_MIDDLE);

				flexTable.setWidget(1, 0, new HTML("* <b>Razão Social:</b> "));
				flexTable.setWidget(1, 1, razaoSocialTxt);

				flexTable.setWidget(2, 0, new HTML("<b>* CNPJ:</b> "));
				flexTable.setWidget(2, 1, cnpjTxt);

				flexTable.setWidget(3, 0, new HTML("Responsável: "));
				flexTable.setWidget(3, 1, responsavelTxt);

				flexTable.setWidget(4, 0, new HTML("Telefone: "));
				flexTable.setWidget(4, 1, telefoneTxt);

				flexTable.setWidget(5, 0, new HTML("E-Mail: "));
				flexTable.setWidget(5, 1, emailTxt);

				flexTable.setWidget(6, 0, new HTML("CPF do responsável: "));
				flexTable.setWidget(6, 1, cpfResponsavelTxt);

				flexTable.setWidget(7, 0, new HTML("RG do responsável: "));
				flexTable.setWidget(7, 1, rgResponsavelTxt);

				flexTable.setWidget(8, 0, new HTML("CEP:"));
				flexTable.setWidget(8, 1, cepTxt);

				flexTable.setWidget(9, 0, new HTML("Endereço da empresa: "));
				flexTable.setWidget(9, 1, enderecoTxt);

				flexTable.setWidget(10, 0, new HTML("Número da empresa: "));
				flexTable.setWidget(10, 1, numeroTxt);

				flexTable.setWidget(11, 0, new HTML("Bairro da empresa: "));
				flexTable.setWidget(11, 1, bairroTxt);

				flexTable.setWidget(12, 0, new HTML("Complemento: "));
				flexTable.setWidget(12, 1, complementoTxt);

				flexTable.setWidget(13, 0, new HTML("Cidade: "));
				flexTable.setWidget(13, 1, cidadeTxt);

				flexTable.setWidget(14, 0, new HTML("Estado: "));
				flexTable.setWidget(14, 1, estadosListBox);

				cnpjTxt.setText(resultDadosEmpresa.getCnpj() == null ? "" : resultDadosEmpresa.getCnpj());
				razaoSocialTxt.setText(resultDadosEmpresa.getRazaoSocial() == null ? "" : resultDadosEmpresa.getRazaoSocial());
				responsavelTxt.setText(resultDadosEmpresa.getResponsavel() == null ? "" : resultDadosEmpresa.getResponsavel());
				telefoneTxt.setText(resultDadosEmpresa.getTelefone() == null ? "" : resultDadosEmpresa.getTelefone());
				emailTxt.setText(resultDadosEmpresa.getEmail() == null ? "" : resultDadosEmpresa.getEmail());
				cpfResponsavelTxt.setText(resultDadosEmpresa.getCpfResponsavel() == null ? "" : resultDadosEmpresa.getCpfResponsavel());
				rgResponsavelTxt.setText(resultDadosEmpresa.getRgResponsavel() == null ? "" : resultDadosEmpresa.getRgResponsavel());
				cepTxt.setText(resultDadosEmpresa.getCep() == null ? "" : resultDadosEmpresa.getCep());
				enderecoTxt.setText(resultDadosEmpresa.getEndereco() == null ? "" : resultDadosEmpresa.getEndereco());
				numeroTxt.setText(resultDadosEmpresa.getNumero() == -1 ? "" : Integer.toString(resultDadosEmpresa.getNumero()));
				bairroTxt.setText(resultDadosEmpresa.getBairro() == null ? "" : resultDadosEmpresa.getBairro());
				complementoTxt.setText(resultDadosEmpresa.getComplemento() == null ? "" : resultDadosEmpresa.getComplemento());
				cidadeTxt.setText(resultDadosEmpresa.getCidade() == null ? "" : resultDadosEmpresa.getCidade());
				if(resultDadosEmpresa.getBEstado() != null){					
					estadosListBox.setIndice(resultDadosEmpresa.getBEstado().getId() == null ? 0 : resultDadosEmpresa.getBEstado().getId());
				} else {
					estadosListBox.setIndice(0);
				}
				
				flexTable.setWidget(17, 0, atualizarBtn);
				flexTable.getFlexCellFormatter().setColSpan(17 , 0 , 2);
				flexTable.getFlexCellFormatter().setAlignment(17, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);

				AAlteraDadosEmpresa.this.add(flexTable, DockPanel.CENTER);
			}

			public void onFailure(Throwable caught)
			{
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao buscar dados da Empresa: " + caught.getMessage());
				errorDialogBox.show();
				errorDialogBox.center();
			}
		};

		Util.getService().getEmpresaById(AAlteraDadosEmpresa.this.bEmpresaAssinante.getId(), callbackDadosEmpresa);

		atualizarBtn.addClickListener(
				new ClickListener()
				{
					public void onClick(Widget sender)
					{
						BeanEmpresaAssinante bEmpresaAssinante = new BeanEmpresaAssinante();						
						
						bEmpresaAssinante.setId(AAlteraDadosEmpresa.this.bEmpresaAssinante.getId());
						bEmpresaAssinante.setCnpj(cnpjTxt.getText());
						bEmpresaAssinante.setRazaoSocial(razaoSocialTxt.getText());
						bEmpresaAssinante.setResponsavel(responsavelTxt.getText());
						bEmpresaAssinante.setTelefone(telefoneTxt.getText());
						bEmpresaAssinante.setEmail(emailTxt.getText());
						bEmpresaAssinante.setCpfResponsavel(cpfResponsavelTxt.getText());
						bEmpresaAssinante.setRgResponsavel(rgResponsavelTxt.getText());
						bEmpresaAssinante.setEndereco(enderecoTxt.getText());
						bEmpresaAssinante.setNumero(numeroTxt.getText());
						bEmpresaAssinante.setBairro(bairroTxt.getText());
						bEmpresaAssinante.setComplemento(complementoTxt.getText());
						bEmpresaAssinante.setCidade(cidadeTxt.getText());

						BeanEstado bEstado = new BeanEstado();
						bEstado.setId(estadosListBox.getValue(estadosListBox.getSelectedIndex()));
						bEstado.setEstado(estadosListBox.getItemText(estadosListBox.getSelectedIndex()));

						bEmpresaAssinante.setBEstado(bEstado);
						bEmpresaAssinante.setCep(cepTxt.getText());

						AsyncCallback<BeanEmpresaAssinante> cbAlteraDadosEmpresa = new AsyncCallback<BeanEmpresaAssinante>()
						{
							public void onSuccess(BeanEmpresaAssinante result)
							{
								SuccessDialogBox successDialogBox = new SuccessDialogBox("Dados alterados com sucesso.");
								successDialogBox.show();
								successDialogBox.center();

							};

							public void onFailure(Throwable caught)
							{
								ErrorDialogBox errorDialogBox = new ErrorDialogBox("Erro ao atualizar dados da Empresa: " + caught.getMessage());
								errorDialogBox.show();
								errorDialogBox.center();
							};						
						};

						if (verificarCampos())
						{
							Util.getService().alterarEmpresaAssinante(bEmpresaAssinante, cbAlteraDadosEmpresa);
						}
				}
			
		});		
	}
	
	// valida os campos...
	private boolean verificarCampos()
	{
		  if (cnpjTxt.getText().equalsIgnoreCase(""))
		  {
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Campo 'CNPJ' está vazio.");
				errorDialogBox.show();
				errorDialogBox.center();

				return false;
		  }

		  if (razaoSocialTxt.getText().equalsIgnoreCase(""))
		  {
				ErrorDialogBox errorDialogBox = new ErrorDialogBox("Campo 'Razão Social' está vazio.");
				errorDialogBox.show();	
				errorDialogBox.center();

				return false;
		  }
		  
		  if (!cpfResponsavelTxt.isVazio() && !cpfResponsavelTxt.isCPFValido())
		  {
				InformationDialogBox infoDialogBox = new InformationDialogBox("CPF inválido.");
				infoDialogBox.center();
				infoDialogBox.show();

				return false;
		  }
		  
		  if (!emailTxt.isVazio() && !emailTxt.isEMailValido())
		  {
				InformationDialogBox infoDialogBox = new InformationDialogBox("E-Mail inválido.");
				infoDialogBox.center();
				infoDialogBox.show();

				return false;			  
		  }

		  return true;
	}


	// instancia cada componente de texto da tela
	private void inicializarComponentes()
	{

		cnpjTxt = new CNPJBox();
		razaoSocialTxt = new TextBox();
		responsavelTxt = new TextBox();
		telefoneTxt = new NumberBox();
		emailTxt = new EMailBox();
		cpfResponsavelTxt = new CPFBox();
		rgResponsavelTxt = new NumberBox();
		cepTxt = new CEPBox();
		enderecoTxt = new TextBox();
		numeroTxt = new NumberBox(200);
		bairroTxt = new TextBox();
		complementoTxt = new TextBox();
		cidadeTxt = new TextBox();
		estadosListBox = new EstadosListBox();

		cnpjTxt.setReadOnly(true);
	}

	// seta o tamanho dos campos
	private void setarTamanhoCampos()
	{
		razaoSocialTxt.setWidth("300px");
		responsavelTxt.setWidth("300px");
		telefoneTxt.setWidth("100px");
		telefoneTxt.setMaxLength(8);
		rgResponsavelTxt.setWidth("100px");
		rgResponsavelTxt.setMaxLength(12);
		enderecoTxt.setWidth("300px");
		enderecoTxt.setMaxLength(40);
		numeroTxt.setWidth("50px");
		numeroTxt.setMaxLength(4);
		bairroTxt.setWidth("100px");
		bairroTxt.setMaxLength(20);
		complementoTxt.setWidth("300px");
		complementoTxt.setMaxLength(30);
		cidadeTxt.setWidth("100px");	
		cidadeTxt.setMaxLength(15);
	}
	
	private void setarAlinhamento()
	{
		FlexCellFormatter cellFormatter = flexTable.getFlexCellFormatter();
		
		cellFormatter.setAlignment(0, 0, HasHorizontalAlignment.ALIGN_CENTER, HasVerticalAlignment.ALIGN_MIDDLE);
		
		for (int x = 1; x <= 14; x++)
		{
			cellFormatter.setAlignment(x, 0, HasHorizontalAlignment.ALIGN_RIGHT, HasVerticalAlignment.ALIGN_MIDDLE);
		}
	}
}